<?php
class Itvina_Controller_Plugin_Abstract extends Zend_Controller_Plugin_Abstract
{

	public function routeStartup(Zend_Controller_Request_Abstract $request)
	{
		//$this->getResponse ()->appendBody ( "<p>routeStartup() called</p>\n" );	
	}

	public function routeShutdown(Zend_Controller_Request_Abstract $request)
	{
		//$this->getResponse ()->appendBody ( "<p>routeShutdown() called</p>\n" );
	}

	public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
	{
		//$this->getResponse ()->appendBody ( "<p>dispatchLoopStartup() called</p>\n" );
		

		//kiểm tra có đang DEBUG,test,upload dữ liệu không?
		if (Zend_Registry::get ( 'production' )->itvId != "") //nếu có
		{
			//kiểm tra có phải người dùng là itvina không?
			if (Zend_Registry::get ( 'production' )->itvId != $request->getParam ( 'itvid' )) //nếu không thông báo đang nâng cấp
			{
				$common_helper = new Itvina_Controller_Action_Helper_Common ();
				die ( $common_helper->redirect ( "Hệ thống đang nâng cấp. Quí khách vui lòng chờ trong giây lát!", BASE_URL, Zend_Registry::get ( 'production' )->waitSecond, " (Còn \$span_second giây)" ) );
			}
		}
		
		//lấy vị trí đang đứng = tên module + '/' + tên controller + '/' + tên action
		//lấy zone: vùng đang đứng, zone=adminitrator: quản trị website, ='': website
		$zone = Zend_Registry::get ( 'production' )->defaultZone;
		if ($zone === null)
		{
			$uri = $request->getRequestUri ();
			$zone = strpos ( $uri, BASE_URL . "administrator" ) === false ? "" : "administrator";
		}
		$module_name = $request->getModuleName ();
		$controller_name = $request->getControllerName ();
		$action_name = $request->getActionName ();
		$url = $module_name . "/" . $controller_name . "/" . $action_name;
		
		//Nếu đã dang nhập, lấy dữ liệu lưu trong session
		//Nguoc lại lấy từ nhóm quyền GUEST
		$auth = Zend_Auth::getInstance ();
		if ($auth->hasIdentity ())
		{
			$storage = $auth->getStorage ();
			$object = $storage->read ();
			$group_permission = $object->group_permission;
		}
		else
		{
			$group = new Admin_Model_Group ();
			$group_permission = $group->fetchOneBase ( "group_permission", "group_code='M'", "" );
		}
		
		//kiểm tra quyền
		if ($zone == "") //dang truy cap website 
		{
			//khong bat dang nhập
			$check = false;
			
			//mảng $allow_url chứa 1 số vị trí đặc biệt, dùng chung, public cho người dùng: đăng nhập, đăng xuất
			$allow_url = array ("account/index/no-permission", "default/index/index" );
		}
		else //dang truy cap admin, bat buoc dang nhap
		{
			//mảng $allow_url chứa 1 số vị trí đặc biệt, dùng chung, public cho người dùng: đăng nhập, đăng xuất
			$allow_url = array ("account/index/login", "account/index/logout", "account/index/no-permission" );
			
			//bat buoc dang nhap
			$check = true;
		}
		
		//kiểm tra đăng nhập nếu có
		if ($check)
		{
			if (! $auth->hasIdentity ()) //chưa đăng nhập, thì trả về form dăng nhập
			{
				$this->setReq ( 'login', 'index', 'account', array () );
				return;
			}
		}
		
		//lưu lịch sử thao tác
		$log = new Admin_Model_SystemLog ();
		$log->setSystem_log_action ( $action_name );
		$log->setSystem_log_controller ( $controller_name );
		$log->setSystem_log_module ( $module_name );
		$log->setSystem_log_time ( time () );
		$log->setSystem_log_param ( Zend_Debug::dump ( $request->getParams (), "", false ) );
		$log->setSystem_log_url ( $_SERVER [REQUEST_URI] );
		$log->setSystem_log_user ( Zend_Registry::get ( 'auth' )->account_username );
		$log->insertBase ();
		
		//kiểm tra quyền trừ username itvina, nhóm quyền SA cao nhất và các vị trí trong mảng $allow_url
		if ($object->group_code != 'SA' && $object->account_username != 'itvina' && array_search ( $url, $allow_url ) === false)
		{
			if (strpos ( $group_permission, $url ) !== false) //có quyền
			{
			
			}
			else //không có quyền trở về trang thông báo 
			{
				$this->setReq ( 'no-permission', 'index', 'account', array ('url' => $url ) );
			}
		}
	
	}

	public function setReq($action, $controller, $module, $params)
	{
		$this->_request->setModuleName ( $module );
		$this->_request->setControllerName ( $controller );
		$this->_request->setActionName ( $action );
		$this->dispatchLoopShutdown ();
		foreach ( $params as $key => $value )
			$this->_request->setParam($key, $value);
		$this->dispatchLoopShutdown ();
	}

	public function preDispatch(Zend_Controller_Request_Abstract $request)
	{
		//$this->getResponse ()->appendBody ( "<p>preDispatch() called</p>\n" );
	}

	public function postDispatch(Zend_Controller_Request_Abstract $request)
	{
		//$this->getResponse ()->appendBody ( "<p>postDispatch() called</p>\n" );
	}

	public function dispatchLoopShutdown()
	{
		//$this->getResponse ()->appendBody ( "<p>dispatchLoopShutdown() called</p>\n" );
	}
}
